对于复杂系统来说,基准测试是必不可少的,具体原因有很多,例如确保应用程序在生产环境中可用,或者新添加的代码不会降低系统性能。此外,还可以使应用程序定向崩溃,暴露出潜在问题,以便进行优化。最后要提醒的是,使用基准测试并不是为了迎合市场。
基准测试涉及到软件开发的方方面面,从OEM或JVM厂商到独立Java应用程序的开发者等等等等。很多时候,软件的功能性目标有清楚的定义,但却没有明确性能目标,当然也有就没有对应的基准测试,这样做出的产品往往是不具有可用性的。在笔者的职业生涯中,这样的案例已经见过太多,甚至一些商业上的关键系统也缺乏明确的性能目标。如果系统的性能问题在开发周期的末尾才被发现,那么有可能整个应用程序都不得不推倒重来。
在任何软件开发过程中,性能方面的基准测试是基础环节之一。明确性能目标,简历对应的基准测试,检验测试结果,调整应用程序,重复这个过程直到开发结束。
一般情况下,为了避免产品上线后出现各种尴尬,在软件开发过程中,达到指定的性能目标是基础要求,而且在开发过程中也应不断对产品的性能进行检验。永远不要低估产品性能的重要性,一定要认真仔细。
如果应用程序在开发过程中没有良好的质量保证(Quality Assurance,QA)框架来把关,那么在上线后就很有可能会出现各种错误,以及运行不稳定等情况。更具体一点说,在添加新代码后没有经过完整的功能性单元测试,那么无论代码评审时怎么说,这些代码都有可能会使应用程序崩溃。
使用 回归测试(regression test)的首要目标是保持应用程序的 稳定性。当发现bug并修复时,最好能在调试系统时留下的代码的基础上写一个可以使问题复现的程序,并将之集成到回归测试中,在提交新代码后执行回归测试可以防止同样的问题再次发生。当然,功能测试并不容易集成到回归测试或自包含(self-contained)复现程序中。对于那些难以安装又需要长时间运行的应用程序来说,用回归测试来验证稳定性是很有必要的。
执行回归测试的另一个目的是保持应用程序的 执行性能。出于某些原因,人们对性能测试的重视程度远比不上功能测试,但实际上,它们都非常重要。新增代码很有可能因功能问题而使系统的性能衰退,相比于功能问题,性能问题更难以定位,系统一般不会因性能问题而崩溃。因此,将性能测试集成到质量保证框架中是很有必要的。性能问题隐藏的越久,定位问题的难度就越大,这可能会涉及到新近提交的一大批源代码,而开发人员为了定位性能,有可能需要针对每次修改重新编译并行应用程序,这将耗费大量的时间。
完善的质量保证框架中应该包含功能测试模块和性能测试模块,性能问题和功能问题具有相同的重要性。
性能回归测试还可以用来探究性能的异常变化。不明原因的性能提升看似不错,但实际上可能是引入了某些bug,例如某些关键代码没有被执行。一般来说,当出现性能异常时,应该深入探究其原因,不论性能是提升还是降低,都应该可以通过性能回归测试得到警告信息。
在做性能回归测试时,为了尽快定位问题,应测量尽可能多的性能指标。如果可以的话,代码中的每个修改都应该有回归测试。
现在暂时把复杂系统的回归测试放在一边,先来谈谈可作为单元测试的小程序。针对性能方面进行的单元测试称为 微基准测试(微基准测试)。微基准测试应该易于配置,一般运行时间不长,可以快速判断出是否达到了预定的性能要求。在5.2.3节中会对微基准测试做详细介绍。
使用基准测试的另一个原因是,衡量系统性能是很困难的,例如,"性能好"既可以是高吞吐,也可以是低延迟,二者难以兼得。因此谈性能就要先确定到底谈的是哪个方面,否则如何说应用程序的性能是好还是坏呢?
尽管以通用质量保证框架的角度看,让应用程序处于高工作负载状态更便于测试,但这样做却可能会使测试程序过于复杂,因而无法定位具体问题。
如果应用程序可以划分为多个小的子系统,然后对每个子系统分别进行基准测试,那么就可以避免很多麻烦,不仅更易于对应用程序各个方面进行测试,也更容易针对某一方面的性能进行调优,进一步说,划分为系统也更容易验证代码优化方面的工作是否真正有用。开发工程师们应用认识到,优化工作所涉及到的因素越少,越容易判定优化工作是否有效。
此外,如果简单的、自包含的基准测试能够正确反映应用程序的运行行为,则针对该基准测试所作的性能优化就更具有适用性。因此,基于基准测试而不是整个应用程序做优化可以大大提升开发进度。
最后要提到的是,目前互联网上已有大量针对不同类型应用程序和不同运行环境的工业级基准测试工具。其中一些很适合用于检验、测量某个特定领域的程序性能。例如处理XML文件,解码MP3文件,和处理数据库事务等。
工业级基准测试还给出业界同类产品普遍关注的一些性能指标。本章后面的内容会介绍一些常见的、针对JVM和Java应用程序工业级基准测试工具。
基于标准基准测试的评分来做市场营销是相当不错的做法,对于存在很多竞争厂商的市场领域来说,借助基准测试可以开发出更有竞争力的产品。
如果产品能够在公认的基准测试中取得极佳的成绩,对于市场营销来说是一项极大的优势。